
/*
  Name: 循环队列 
  Copyright: BTC 2004
  Author: Zhuang Bo
  Date: 2004
  Description:
     [Include] 
        ds.h
     [Constants]
        MAXQSIZE
     [Types]
        ElemType
        SqQueue
     [Functions]
        InitQueue(&Q)
        DestroyQueue(&Q)
        ClearQueue(&Q)
        QueueEmpty(Q)
        QueueLength(Q)
        GetHead(Q,&e)
        EnQueue(&Q,e)
        DeQueue(&Q,&e)
     [For Debug]
        PrintElem(ElemType e)
        QueueView(Q)
*/

#ifndef SQQUEUE_H_INCLUDED
#define SQQUEUE_H_INCLUDED /* 防止重复包含 */

//////////////////////////////////////////
//包含头文件 
#include <stdlib.h>
#include "ds.h" // OK, Status 等定义 

//数据元素的类型(缺省使用int型)
#ifndef ElemType
#define ElemType int
#define USE_DEFAULT_ELEMTYPE /* 使用缺省类型的标志 */
#endif //ElemType

//////////////////////////////////////////
//循环队列的存储结构

#define MAXQSIZE 64 /* 循环队列的最大容量 */
typedef struct {
    /* TODO (#1#): 这里完成循环队列的类型定义 */
    //....................................
} SqQueue;


//////////////////////////////////////////
//循环队列的基本操作 

//构造一个空队列Q
Status InitQueue(SqQueue &Q)
{
    /* TODO (#2#): 构造空队列 */
    return ERROR; //TODO: 替换这行代码,以下同
    //....................................
}

//销毁队列Q 
//  前提：队列Q已存在 
Status DestroyQueue(SqQueue &Q)
{
    /* TODO (#3#): 销毁队列 */
    return ERROR;
    //....................................
}

//将队列Q清为空队列
//  前提：队列Q已存在
Status ClearQueue(SqQueue &Q)
{
    /* TODO (#4#): 清空队列 */
    return ERROR;
    //....................................
}

//若队列Q为空，则返回TRUE，否则FALSE 
//  前提：队列Q已存在
Status QueueEmpty(SqQueue Q)
{
    /* TODO (#5#): 判断队列是否为空 */
    return FALSE;
    //....................................
}

//返回队列Q的元素个数，即队列长度
//  前提：队列Q已存在 
int QueueLength(SqQueue Q)
{
    /* TODO (#6#): 返回队列长度 */
    return 0;
    //....................................
}

//取队列Q头元素用e返回
//  前提：队列Q存在且非空
Status GetHead(SqQueue Q, ElemType &e)
{
    /* TODO (#7#): 取队头元素存入e */
    return ERROR;//返回操作状态(成功:OK,失败:ERROR)
    //....................................
}

//插入元素e作为队列Q的新的队尾元素
//  前提：队列Q存在且未满
Status EnQueue(SqQueue &Q, ElemType e)
{
    /* TODO (#8#): 元素e入队列 */
    return ERROR;//返回操作状态(成功:OK,失败:ERROR)
    //....................................
}

//删除队列Q的队头元素，并用e返回 
//  前提：队列Q存在且非空 
Status DeQueue(SqQueue &Q, ElemType &e)
{
    /* TODO (#9#): 出队列存入e */
    return ERROR;//返回操作状态(成功:OK,失败:ERROR)
    //....................................
}

//////////////////////////////////////////


//TODO: 定义好 SqQueue 类型后使用 QueueView 函数 
/****** //TODO: 删除此行以便使用QueueView()
#include <stdio.h>
//查看队列状态(调试用)
void QueueView(SqQueue Q)
{
   extern void PrintElem(ElemType e);//打印数据用 
   int i=0;
   if(Q.front<0||Q.front>=MAXQSIZE||Q.rear<0||Q.rear>=MAXQSIZE){
       printf("队列未初始化\n"); 
       return ;
   }
   printf("---Queue View---\n");
   printf("front=%d , rear=%d\n", Q.front, Q.rear);
   if(Q.rear>=Q.front) {
       printf(".....   ......\n");
       for(i=Q.front; i<Q.rear; i++) {
           printf("%5d\t", i);
           PrintElem(Q.base[i]);
           printf("\n");
       }
       if(i<MAXQSIZE) printf(".....   ......\n");
   } else {       
       for(i=0; i<Q.rear; i++) {
           printf("%5d\t", i);
           PrintElem(Q.base[i]);
           printf("\n");
       }
       printf(".....   ......\n");
       for(i=Q.front; i<MAXQSIZE; i++) {
           printf("%5d\t", i);
           PrintElem(Q.base[i]);
           printf("\n");
       }
   }
   printf("--- view end ---\n");
}
******/ //TODO: 删除此行以便使用QueueView()

//取消ElemType的默认定义，以免影响其它部分 
#ifdef USE_DEFAULT_ELEMTYPE
#undef ElemType
#undef USE_EFAULT_ELEMTYPE
#endif

#endif //SQQUEUE_H_INCLUDED

